file_extension: A extensão do arquivo.
data %>% select(file_extension) %>% unique
## # A tibble: 42 x 1
## file_extension
## <chr>
## 1 md
## 2 js
## 3 json
## 4 html
## 5 py
## 6 java
## 7 css
## 8 xml
## 9 txt
## 10 yml
## # ... with 32 more rows
Como é possível ver no resumo acima, temos extensões para scripts, imagens, textos, etc.
month_day, the_month, the_year: Dia, mês e ano respectivamente em que a coleta dos dados foi efetuada.
data %>% select(-file_extension, -users) %>% summary()
## month_day the_month the_year
## Min. : 1.00 Min. : 1.000 Min. :2016
## 1st Qu.: 8.00 1st Qu.: 3.000 1st Qu.:2016
## Median :15.00 Median : 4.000 Median :2016
## Mean :15.49 Mean : 5.427 Mean :2016
## 3rd Qu.:23.00 3rd Qu.: 8.000 3rd Qu.:2017
## Max. :31.00 Max. :12.000 Max. :2017
Temos dados desde 2016 até 2017, como falado anteriormente.
users: Quantidade de usuários que modificaram aquele tipo de arquivo até a data da coleta.
data %>% select(users) %>% summary()
## users
## Min. : 501
## 1st Qu.: 763
## Median : 1520
## Mean : 2151
## 3rd Qu.: 2782
## Max. :10279
Como possível visualizar acima, temos tipos de arquivos que tiveram 501 usuários mas também temos outros que tiveram 10279 usuários.
Para popularidade não teremos tanto trabalho, iremos adotar a popularidade como sendo a mediana de usuários que contribuíram. Ou seja, quanto maior a média, mais popular é aquela linguagem.
Para isso, iremos pegar as linguagens de programação no nosso conjunto de dados e a partir disso selecionar apenas as que tiveram registros no último mês.
Após a aplicação de uma função max, obtivemos o valor:
languages %>%
filter(file_extension %in% some_programming_languages) %>%
filter(the_year == 2017) %>%
select(the_month) %>%
sapply(max, na.rm = TRUE)
## the_month
## 5
Portanto, sabemos que o último mês de 2017 que tivemos registros foi o mês 5.
languages %>%
filter(file_extension %in% some_programming_languages) %>%
group_by(file_extension) %>%
summarise(popularity = median(users)) %>%
ggplot(aes(
x = reorder(file_extension, popularity),
y = popularity,
fill = file_extension)) +
geom_bar(stat = "identity") +
labs(x = "Linguagem de Programação", y = "Popularidade") +
guides(fill=guide_legend(title=NULL)) -> p
ggplotly(p)
languages %>%
filter(file_extension %in% some_programming_languages) %>%
filter(the_year == 2017, the_month == 5) %>%
group_by(file_extension) %>%
summarise(popularity = median(users)) %>%
ggplot(aes(
x = reorder(file_extension, popularity),
y = popularity,
fill = file_extension)) +
geom_bar(stat = "identity") +
labs(x = "Linguagem de Programação", y = "Popularidade") +
guides(fill=guide_legend(title=NULL)) -> p
ggplotly(p)
Como podemos ver acima, as duas linguagens de programação mais populares foram js e py, JavaScript e Python respectivamente.
selected_languages <- languages %>% filter(file_extension %in% c("py","js"))
A partir disso, iremos fazer uma comparação mês a mês entre as linguagens Python e JavaScript e verificar como se comporta a diferença de crescimento de usuários.
set.seed(123)
ic_diff = function(data, group1, group2, period){
difference = function(data, i, group1, group2){
d = data %>%
slice(i) %>%
group_by(file_extension, the_month, the_year) %>%
summarise(popularity = median(users)) %>%
mutate(mmyy = paste(the_month, the_year, sep = "-")) %>%
filter(mmyy == period)
group1_df <- d %>% filter(file_extension == group1)
group2_df <- d %>% filter(file_extension == group2)
m1 = 0
m2 = 0
if (nrow(group1_df) != 0) {
m1 = group1_df %>% pull(popularity)
}
if (nrow(group2_df) != 0) {
m2 = group2_df %>% pull(popularity)
}
m1 - m2
}
bootstrap = boot(data,
statistic = difference,
R = 1000,
group1 = group1,
group2 = group2)
ci = boot.ci(bootstrap,
conf = 0.95,
type = "basic")
ci
}
languages_2016 <- selected_languages %>% filter(the_year == 2016)
languages_2017 <- selected_languages %>% filter(the_year == 2017)
months <- c("JAN", "FEV", "MAR", "ABR", "MAI", "JUN", "JUL", "AGO", "SET", "OUT", "NOV", "DEZ")
set.seed(123)
order_comp <- factor(comparacoes$comparacao, levels = months)
comparacoes %>%
ggplot() +
aes(x = order_comp, ymin = lower, ymax = upper) +
geom_hline(yintercept = 0, colour = "red") +
geom_errorbar(width = .5) +
labs(x = "Mês",
y = "Diferença de Popularidade (py - js)") +
facet_wrap(~year, scales = "free") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Em todos os meses, exceto em MAIO de 2017, com um grau de confiança de 95%, a linguagem JavaScript é superior em popularidade em relação a Python, visto que a diferença (py - js) é negativa, ou seja, js > py.
De forma análoga, as duas linguagens de programação menos populares para o último mês foram ts e go, TypeScript e GO respectivamente.
selected_languages_v2 <- languages %>% filter(file_extension %in% c("ts","go"))
Para responder nossa pergunta, iremos executar os mesmos passos da pergunta anterior.
set.seed(123)
languages_2016_v2 <- selected_languages_v2 %>% filter(the_year == 2016)
languages_2017_v2 <- selected_languages_v2 %>% filter(the_year == 2017)
set.seed(123)
order_comp_v2 <- factor(comparacoes_v2$comparacao, levels = months)
comparacoes_v2 %>%
ggplot() +
aes(x = order_comp_v2, ymin = lower, ymax = upper) +
geom_hline(yintercept = 0, colour = "red") +
geom_errorbar(width = .5) +
labs(x = "Mês",
y = "Diferença de Popularidade (go - ts)") +
facet_wrap(~year, scales = "free") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Em todos os meses, exceto em ABRIL de 2017, com um grau de confiança de 95%, a linguagem GO é superior em popularidade em relação a TypeScript, visto que a diferença (go - ts) é positiva, ou seja, go > ts.
Vamos coletar dados apenas das linguagens de programação vistas mais acima que tiveram suas coletas em dias da semana (entre segunda e sexta).
seg_sex <- c("segunda-feira", "sexta-feira")
sab_dom <- c("sábado", "domingo")
languages %>%
mutate(is_seg_sex = weekdays(languages$cronology) %in% seg_sex) %>%
filter(weekdays(languages$cronology) %in% sab_dom != TRUE) %>%
filter(file_extension %in% some_programming_languages) -> languages_days
languages_days %>%
sample_n(10)
## # A tibble: 10 x 7
## file_extension month_day the_month the_year users cronology is_seg_sex
## <chr> <int> <int> <int> <int> <date> <lgl>
## 1 java 17 11 2016 3742 2016-11-17 FALSE
## 2 go 6 12 2016 1011 2016-12-06 FALSE
## 3 php 21 2 2017 2653 2017-02-21 FALSE
## 4 ts 30 11 2016 856 2016-11-30 FALSE
## 5 ts 2 1 2017 631 2017-01-02 TRUE
## 6 js 17 1 2017 7451 2017-01-17 FALSE
## 7 rb 14 1 2016 1687 2016-01-14 FALSE
## 8 go 3 10 2016 836 2016-10-03 TRUE
## 9 c 15 2 2016 1618 2016-02-15 TRUE
## 10 php 8 3 2017 2383 2017-03-08 FALSE
languages_days %>%
group_by(file_extension, is_seg_sex) %>%
summarise(popularity = median(users)) %>%
ggplot(aes(
x = reorder(file_extension, popularity),
y = popularity,
fill = is_seg_sex)) +
geom_histogram(stat = "identity") +
labs(x = "Linguagem de Programação", y = "Popularidade") -> p
## Warning: Ignoring unknown parameters: binwidth, bins, pad
ggplotly(p)
Com essa simples visualização conseguimos perceber que os commits costumam ser efetuados entre a Terças, Quartas e Quintas.
Como CC não possui nenhum registro dentro sendo uma Segunda ou Sexta, iremos removê-lo do Bootstrapping por não fazer sentido calcular diferença.
Abaixo definimos a função que irá realizar o bootstrapping para cada uma das linguagens e extrair a diferença entre os dois períodos a serem avaliados na semana.
diffs <- frame_data(~lang, ~X2.5., ~X97.5.)
bootstrapping = function(data) {
diff_median <- bootstrap2(data$users,
treatment = data$is_seg_sex,
median, R = 10000)
diff = CI.percentile(diff_median, probs = c(.025, .975))
diff
}
Diffs será o nosso conjunto de dados que irá armazenar a linguagem e o intervalo da diferença gerado pela função de bootstrapping.
Não irei mostrar o código usado para popular o conjunto de dados mas basicamente usei a função acima e atribuí os intervalos do diff para as colunas X2.5. e X97.5. respectivamente, além de colocar o nome da linguagem na coluna referente.
diffs %>%
ggplot(aes(
x = lang,
ymin = X2.5.,
ymax = X97.5.)) +
geom_errorbar(width = .2) +
geom_hline(yintercept = 0, colour = "cyan") +
labs(x = "Linguagem de Programação", y = "Diferença do is_seg_sex (FALSE - TRUE)")
Com a visualização acima, podemos perceber que por ter um valor majoritariamente positivo, exceto para as linguagens Swift (swift) e TypeScript (ts) que passam pelo eixo y = 0, os valores de usuários que commitam nas Terças, Quartas e Quintas é maior em relação aos que commitam nas Segundas e Sextas.
Para isso, iremos pegar apenas uma parte dos dados que faz referência aos commits em Segundas e Sextas.
seg_sex <- c("segunda-feira", "sexta-feira")
languages %>%
mutate(is_seg = weekdays(languages$cronology) == "segunda-feira") %>%
filter(weekdays(languages$cronology) %in% seg_sex == TRUE) %>%
filter(file_extension %in% some_programming_languages) -> languages_days_v2
languages_days_v2 %>%
sample_n(10)
## # A tibble: 10 x 7
## file_extension month_day the_month the_year users cronology is_seg
## <chr> <int> <int> <int> <int> <date> <lgl>
## 1 php 31 3 2017 2209 2017-03-31 FALSE
## 2 rb 24 6 2016 1260 2016-06-24 FALSE
## 3 py 13 1 2017 4604 2017-01-13 FALSE
## 4 c 28 10 2016 1421 2016-10-28 FALSE
## 5 ts 8 7 2016 570 2016-07-08 FALSE
## 6 js 29 8 2016 6632 2016-08-29 TRUE
## 7 php 22 2 2016 2998 2016-02-22 TRUE
## 8 c 7 10 2016 1243 2016-10-07 FALSE
## 9 php 27 1 2017 2375 2017-01-27 FALSE
## 10 py 25 1 2016 5036 2016-01-25 TRUE
languages_days_v2 %>%
group_by(file_extension, is_seg) %>%
summarise(popularity = median(users)) %>%
ggplot(aes(
x = reorder(file_extension, popularity),
y = popularity,
fill = !is_seg)) +
geom_histogram(stat = "identity") +
labs(x = "Linguagem de Programação", y = "Popularidade") -> p
## Warning: Ignoring unknown parameters: binwidth, bins, pad
ggplotly(p)
Com a visualização acima é possível perceber que o dia mais escolhido é a Sexta feira, pois existe uma maior quantidade de usuários (na maioria das linguagens) para a barra alaranjada.
De forma análoga à questão mais acima, usamos uma outra função para o bootstrapping, desta vez trocando apenas a variável que indica se o dia é Segunda ou não.
Aqui também retiramos a linguagem cc visto que ela não tem nenhum registro com data de Segunda ou Sexta.
diffs_v2 %>%
ggplot(aes(
x = lang,
ymin = X2.5.,
ymax = X97.5.)) +
geom_errorbar(width = .2) +
geom_hline(yintercept = 0, colour = "cyan") +
labs(x = "Linguagem de Programação", y = "Diferença do is_seg (FALSE - TRUE)")
Com a visualização acima, não conseguimos chegar a muitos resultados pois aproximadamente 77% (7 de 9) das linguagens passam o eixo y = 0. Podemos concluir apenas para as linguagens JavaScript (js) e PHP (php) que o dia mais escolhido para os commits é a Segunda, visto que a diferença é negativa, pois se FALSE - TRUE < 0, implica dizer que TRUE > FALSE.
Portanto, a Segunda é o dia mais escolhido apenas para JavaScript (js) e PHP (php). Enquanto que para as demais linguagens, nada podemos concluir.